{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.tensor([1, 2, 3])\n",
    "torch.is_tensor(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.2673,  0.4471,  0.2822,  0.7392,  0.8475],\n",
       "        [ 1.5716,  0.2585, -1.5064,  1.4176, -0.8048],\n",
       "        [-0.4651,  1.1774,  0.8826, -0.1221, -0.8888],\n",
       "        [-1.1874,  1.3246, -0.6299,  0.0135,  1.0608]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.randn(4,5)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.2673, 0.4471],\n",
       "        [1.5716, 0.2585]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = torch.as_strided(x, (2,2), (5,1))\n",
    "t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAGxCAYAAACQtpRoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/sUlEQVR4nO3deViU9f7/8dcIshngloiJiPu+gZlbZhrlVnZazMzd0qO5RJtmHpdKWo027VCpWUejk2aLlnHMfTkmYXXS1HIBFXfFLUHg/v3hl/k5DijcIPfd8Hxc11yX3HPP537PgLx4f+7NYRiGIQAA4BHKWF0AAAAoPgQ7AAAehGAHAMCDEOwAAHgQgh0AAA9CsAMA4EEIdgAAPAjBDgCAByHYAQDwIAS7Re6++275+/vr5MmT+a7Tr18/lS1bVocOHdLcuXPlcDi0Z8+eEqsxL3v27JHD4dDcuXOdy6yqbdCgQapZs2ahXtOqVSs5HA69+uqreT4/f/58xcXFuS0/d+6cpkyZopUrVxa+UBPyq0OSHA6HpkyZUiJ15Prss8/kcDiUkJDg9lzz5s3lcDi0bNkyt+dq166tVq1aFWpbZr6vuaZMmSKHw6GjR49edd3p06dr8eLFprYD2BnBbpGhQ4fq/Pnzmj9/fp7Pp6en6/PPP1fPnj0VEhKiHj16aMOGDQoNDS3hSq/OzrVdasuWLUpOTpYkffDBB3muc6Vgnzp1qi2CfcOGDRo2bFiJ1JHrlltukcPh0IoVK1yWHz9+XL/88ovKlSvn9ty+ffu0a9cude7cuVDbmjRpkj7//PMi13w1BDs8FcFukW7duqlatWqaPXt2ns8vWLBAf/75p4YOHSpJuv7663XTTTfJ19e3JMssEDvXdqn3339f0sU/RH777TetX7/e4orMuemmm1S9evUS3WblypXVpEkTtz9sVq1aJW9vbw0dOtQt2HO/Lmyw165dWy1btixSvUBpRrBbxMvLSwMHDlRSUpJ++eUXt+fnzJmj0NBQdevWTVLe093Jycnq2bOnqlSpIl9fX1WrVk09evTQvn37JOU9bZ7r8unc33//XYMHD1bdunUVEBCgG264Qb169cqztstdXtvKlSvlcDjyfFw+xZqQkKC2bduqXLlyuu6663T77bc7u+rLt1G/fn35+vqqYcOGmjdv3lXrulTu7EhkZKRef/11SXL7o+qWW27RkiVLtHfvXpea9+zZo+uvv16SNHXqVOfyQYMGOV+7c+dOPfjgg87vRcOGDfXOO++4jJ/7uSxYsEATJ05UtWrVFBQUpK5du2r79u1XrSNXXlPx//vf/3TXXXepQoUK8vPzU4sWLfThhx+a2n5+OnfurO3btystLc1lzNatW6t79+5KSkrS6dOnXZ7z8vJSx44dJUmGYWjmzJlq0aKF/P39VaFCBd17773atWuXy3bymoo/efKkhg4dqooVK+q6665Tjx49tGvXrnx3Sxw6dEh9+/ZVcHCwQkJCNGTIEKWnp7t8hmfPntWHH37o/HxvueUWSRdnZ5544glFRETIz89PFStWVFRUlBYsWHDVzwiwA4LdQkOGDJHD4XALmK1bt2rTpk0aOHCgvLy88nzt2bNnddttt+nQoUN65513lJiYqLi4ONWoUcPll2tBHThwQJUqVdKLL76ob7/9Vu+88468vb3Vpk2bAv3Sv1SrVq20YcMGl8e8efNUtmxZNW7c2Lne9OnT1bdvXzVq1EiffvqpPvroI50+fVodO3bU1q1bnevNnTtXgwcPVsOGDbVw4UI9++yzeu655/T9998XuKZFixbpxIkTGjJkiOrWrasOHTooISFBZ86cca4zc+ZMtW/fXlWrVnWpPTQ0VN9++62ki7tQcpdPmjRJ0sXvV+vWrfW///1Pr732mr7++mv16NFDY8aM0dSpU91qeeaZZ7R37169//77io+P186dO9WrVy9lZ2dfsY78bN++Xe3atdOvv/6qN998U4sWLVKjRo00aNAgvfzyy4Xefn5yO+9Lu/YVK1aoU6dOat++vRwOh9asWePyXKtWrRQcHCxJGj58uMaNG6euXbtq8eLFmjlzpn799Ve1a9dOhw4dyne7OTk56tWrl+bPn6+nn35an3/+udq0aaM77rgj39fcc889qlevnhYuXKjx48dr/vz5euyxx5zPb9iwQf7+/urevbvz8505c6YkKSYmRrNmzdKYMWP07bff6qOPPtJ9992nY8eOXfHzAWzDgKU6depkVK5c2cjMzHQue/zxxw1Jxo4dO5zL5syZY0gydu/ebRiGYWzevNmQZCxevDjfsXfv3m1IMubMmeP2nCRj8uTJ+b42KyvLyMzMNOrWrWs89thjVxzz8toud+jQIaNWrVpG48aNjRMnThiGYRgpKSmGt7e3MXr0aJd1T58+bVStWtW4//77DcMwjOzsbKNatWpGq1atjJycHOd6e/bsMcqWLWuEh4fn+x4udeuttxp+fn7O7efW/MEHH7is16NHjzzHPHLkSL6f2e23325Ur17dSE9Pd1n+6KOPGn5+fsbx48cNwzCMFStWGJKM7t27u6z36aefGpKMDRs2XLUOw3D/3j3wwAOGr6+vkZKS4rJet27djICAAOPkyZOF3n5ejh8/bpQpU8Z45JFHDMMwjKNHjxoOh8P49ttvDcMwjBtvvNF44oknDMO4+P2VZDz11FOGYRjGhg0bDEnGa6+95jJmamqq4e/v71zPMAxj4MCBLu99yZIlhiRj1qxZLq+NjY11+ywmT55sSDJefvlll3VHjhxp+Pn5ufwMlStXzhg4cKDb+2zSpInRu3fvK34WgJ3RsVts6NChOnr0qL788ktJUlZWlj7++GN17NhRdevWzfd1derUUYUKFfT000/r3XffdelwzcjKytL06dPVqFEj+fj4yNvbWz4+Ptq5c6e2bdtmetyzZ8+qR48eOn/+vL755huVL19ekrRs2TJlZWVpwIABysrKcj78/PzUqVMnZ1e4fft2HThwQA8++KDLdHR4eLjatWtXoBp2796tFStW6G9/+5tz+/fdd58CAwPzPcahoM6fP6/ly5fr7rvvVkBAgMt76d69u86fP6+NGze6vObOO+90+bpZs2aSpL1795qq4fvvv1eXLl0UFhbmsnzQoEE6d+6cW7dvdvsVKlRQ8+bNnd+bVatWycvLS+3bt5ckderUyblf/fL9619//bUcDoceeughl8+oatWqLmPmZdWqVZKk+++/32V53759831NXu/x/PnzOnz48BXfoyTdeOON+uabbzR+/HitXLlSf/7551VfA9gJwW6xe++9V8HBwZozZ44kaenSpTp06JDzoLn8BAcHa9WqVWrRooWeeeYZNW7cWNWqVdPkyZN14cKFQtcRExOjSZMmqXfv3vrqq6/03//+Vz/88IOaN29u+hdbVlaW7r33Xu3YsUNLly51CZ7cqdfWrVurbNmyLo+EhATn6Uq5059Vq1Z1Gz+vZXmZPXu2DMPQvffeq5MnT+rkyZO6cOGC7rzzTq1bt06//fabqfeXW19WVpbeeustt/fRvXt3SXI79apSpUouX+cedGj2cz527FieZyRUq1bN+Xxxbb9z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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 定义softmax函数\n",
    "def softmax(x):\n",
    "    e_x = np.exp(x - np.max(x))\n",
    "    return e_x / e_x.sum(axis=1, keepdims=True)\n",
    "\n",
    "# 随机生成10x10矩阵\n",
    "matrix = np.random.randn(10, 10)\n",
    "\n",
    "# 对每行应用softmax\n",
    "matrix_softmax = softmax(matrix)\n",
    "\n",
    "# 可视化\n",
    "plt.imshow(matrix_softmax, cmap='gray')\n",
    "plt.colorbar(label='Attention Weight')\n",
    "plt.title('Visualized Attention Weights')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ML",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
